#include <stdio.h>
#include <stdlib.h>
#include "estructuras.h"

extern unsigned int* generar_tabla_apariciones(unsigned char *buf, unsigned int size);
extern codigo_t* generar_tabla_codigos(unsigned int *tabla_apariciones);
extern int calcular_longitud_codificacion(unsigned int *tabla_apariciones, codigo_t *tabla_codigo);
extern int generar_codificacion(unsigned char *src_buf, unsigned int src_size, unsigned char *dst_buf, unsigned int dst_size, codigo_t *tabla_codigos);

int main(){
	//Creamos la tabla de apariciones.
	unsigned int src_size = 8;
	unsigned char *src_buf = (unsigned char *)malloc(src_size);
	
	int i;
	for (i = 0; i<src_size/4; i++){
		src_buf[i] = 0;
	}
	
	for (i = src_size/4; i<src_size/2; i++){
		src_buf[i] = 1;
	}
	
	for (i = src_size/2; i<src_size; i++){
		src_buf[i] = 2;
	}
	
	unsigned int *tabla_apariciones;
	tabla_apariciones = generar_tabla_apariciones(src_buf, src_size);
	
	codigo_t *tabla_codigos = generar_tabla_codigos(tabla_apariciones);
	
	int long_codif = calcular_longitud_codificacion(tabla_apariciones, tabla_codigos);
	
	printf("Esta es la tabla de codigos \n");
	
	for (i=0; i<256; i++){
		if(tabla_codigos[i].valido){
			printf("Esta es la posicion %i \n", i);
			mostrar_codigo_t(&tabla_codigos[i]);
		}
	}
	
	unsigned int dst_size = long_codif/8;
	
	if (long_codif % 8 != 0) dst_size +=1;
	
	printf("La longitud de la codificacion en bits: %d \n", long_codif);
	
	printf("La longitud de la codificacion en bytes: %d \n", dst_size);
	
	unsigned char *dst_buf = (unsigned char *)malloc(long_codif);
	
	int res = generar_codificacion(src_buf, src_size, dst_buf, dst_size, tabla_codigos);
	
	printf("El resultado de la codificacion es: %d \n", res);
	
	return 0;
}
